{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6f09671e",
   "metadata": {},
   "source": [
    "# GPT4All\n",
    "\n",
    "[GPT4All](https://gpt4all.io/index.html)은 무료로 사용할 수 있는 로컬 실행 기반의 개인정보 보호를 고려한 챗봇입니다.\n",
    "\n",
    "GPU나 인터넷 연결이 필요하지 않으며, GPT4All Falcon, Wizard 등 인기 있는 모델과 자체 모델을 제공합니다.\n",
    "\n",
    "이 노트북에서는 LangChain과 함께 [GPT4All embeddings](https://docs.gpt4all.io/gpt4all_python_embedding.html#gpt4all.gpt4all.Embed4All)를 사용하는 방법을 설명합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a9994d0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# API KEY를 환경변수로 관리하기 위한 설정 파일\n",
    "from dotenv import load_dotenv\n",
    "\n",
    "# API KEY 정보로드\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "855f6c21",
   "metadata": {},
   "outputs": [],
   "source": [
    "# LangSmith 추적을 설정합니다. https://smith.langchain.com\n",
    "# !pip install langchain-teddynote\n",
    "from langchain_teddynote import logging\n",
    "\n",
    "# 프로젝트 이름을 입력합니다.\n",
    "logging.langsmith(\"CH08-Embeddings\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ce0b701",
   "metadata": {},
   "source": [
    "## GPT4All의 Python 바인딩 설치\n",
    "\n",
    "GPT4All의 Python 바인딩을 설치하려면 다음 명령을 실행하세요\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "258b4fcf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 설치\n",
    "# !pip install -qU  gpt4all > /dev/null"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4b2042f",
   "metadata": {},
   "source": [
    "- `GPT4AllEmbeddings` 클래스를 `langchain_community.embeddings` 모듈에서 임포트합니다.\n",
    "\n",
    "`GPT4AllEmbeddings`는 GPT4All 모델을 사용하여 텍스트 데이터를 벡터로 임베딩하는 기능을 제공하는 클래스입니다. 이 클래스는 LangChain 프레임워크의 임베딩 인터페이스를 구현하여, LangChain의 다양한 기능과 함께 사용할 수 있습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c687401b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.embeddings import GPT4AllEmbeddings"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f456df15",
   "metadata": {},
   "source": [
    "GPT4All은 CPU에 최적화된 대조 학습 문장 변환기를 사용하여 임의 길이의 텍스트 문서에 대한 고품질 임베딩 생성을 지원합니다. 이러한 임베딩은 OpenAI를 사용하는 많은 작업에서 품질이 비슷합니다.\n",
    "\n",
    "`GPT4AllEmbeddings` 클래스의 인스턴스를 생성합니다.\n",
    "\n",
    "- `GPT4AllEmbeddings`는 GPT4All 모델을 사용하여 텍스트 데이터를 벡터로 변환하는 임베딩 모델입니다.\n",
    "- 이 코드에서는 `gpt4all_embd` 변수에 `GPT4AllEmbeddings` 인스턴스를 할당합니다.\n",
    "- 이후 `gpt4all_embd`를 사용하여 텍스트 데이터를 벡터로 변환할 수 있습니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a06dcfb4",
   "metadata": {},
   "outputs": [],
   "source": [
    "gpt4all_embd = GPT4AllEmbeddings()  # GPT4All 임베딩 객체를 생성합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1998cdf1",
   "metadata": {},
   "outputs": [],
   "source": [
    "gpt4all_embd = GPT4AllEmbeddings()  # GPT4All 임베딩 객체를 생성합니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0602cb47",
   "metadata": {},
   "source": [
    "- `text` 변수에 \"임베딩 테스트를 하기 위한 샘플 문장입니다.\" 라는 문자열을 할당합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9dff94dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "text = (\n",
    "    \"임베딩 테스트를 하기 위한 샘플 문장입니다.\"  # 테스트용 문서 텍스트를 정의합니다.\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9fc286dd",
   "metadata": {},
   "source": [
    "## Embed the Textual Data\n",
    "\n",
    "텍스트 데이터를 임베딩하는 과정은 다음과 같습니다.\n",
    "\n",
    "먼저, 텍스트 데이터를 토큰화하여 숫자 형태로 변환합니다.\n",
    "\n",
    "이때, 사전 학습된 토크나이저(tokenizer)를 활용하여 텍스트를 토큰 단위로 분리하고, 각 토큰을 고유한 정수로 매핑합니다.\n",
    "\n",
    "다음으로, 토큰화된 데이터를 임베딩 레이어에 입력하여 고차원의 밀집 벡터(dense vector) 형태로 변환합니다.\n",
    "\n",
    "이 과정에서 각 토큰은 해당 토큰의 의미와 문맥을 포착하는 실수 값들의 벡터로 표현됩니다.\n",
    "\n",
    "마지막으로, 임베딩된 벡터는 다양한 자연어 처리 작업에 활용될 수 있습니다.\n",
    "\n",
    "예를 들어, 문서 분류, 감성 분석, 기계 번역 등의 작업에서 입력 데이터로 사용되어 모델의 성능을 향상시킬 수 있습니다.\n",
    "\n",
    "이러한 텍스트 데이터 임베딩 과정은 자연어 처리 분야에서 매우 중요한 역할을 하며, 대량의 텍스트 데이터를 효과적으로 처리하고 분석하는 데 필수적입니다.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d497f9e5",
   "metadata": {},
   "source": [
    "`gpt4all_embd` 객체의 `embed_query` 메서드를 사용하여 주어진 텍스트(`text`)를 임베딩합니다.\n",
    "\n",
    "- `text` 변수에 임베딩할 텍스트가 저장되어 있습니다.\n",
    "- `gpt4all_embd` 객체는 GPT4All 모델을 사용하여 텍스트 임베딩을 수행하는 객체입니다.\n",
    "- `embed_query` 메서드는 주어진 텍스트를 벡터 형태로 변환하여 반환합니다.\n",
    "- 임베딩 결과는 `query_result` 변수에 저장됩니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "529a1c1b",
   "metadata": {},
   "outputs": [],
   "source": [
    "query_result = gpt4all_embd.embed_query(\n",
    "    text\n",
    ")  # 주어진 텍스트에 대한 쿼리 임베딩을 생성합니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13a35a6e",
   "metadata": {},
   "source": [
    "embed_documents 함수를 사용하면 여러 개의 텍스트 조각을 임베딩할 수 있습니다.\n",
    "\n",
    "또한 이러한 임베딩을 Nomic의 Atlas(https://docs.nomic.ai/index.html)와 매핑하여 데이터의 시각적 표현을 확인할 수 있습니다.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db51866a",
   "metadata": {},
   "source": [
    "임베딩된 차원의 크기를 확인합니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa5baf2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 임베딩된 차원의 크기를 확인합니다.\n",
    "len(query_result)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f09a0f7",
   "metadata": {},
   "source": [
    "`gpt4all_embd` 객체의 `embed_documents` 메서드를 사용하여 `text` 문서를 임베딩합니다.\n",
    "\n",
    "- `text` 문서를 리스트로 감싸서 `embed_documents` 메서드의 인자로 전달합니다.\n",
    "- `embed_documents` 메서드는 문서의 임베딩 벡터를 계산하여 반환합니다.\n",
    "- 반환된 임베딩 벡터는 `doc_result` 변수에 저장됩니다.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "18f7c3af",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 주어진 텍스트를 임베딩하여 문서 벡터를 생성합니다.\n",
    "doc_result = gpt4all_embd.embed_documents([text])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "630cf5e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 임베딩된 차원의 크기를 확인합니다.\n",
    "len(doc_result[0])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
